package com.wxx.example.callback;

import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.wxx.common.Const;
import com.wxx.util.AppUtil;
import com.wxx.util.IosVerifyUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/appleCallBack")
public class AppleCallBackController {


    /***
     * 示例
     * @param transactionID 前端返回苹果返回的值
     * @param receipt       前端返回苹果返回的值
     * @param id            添加记录的主键id，修改状态使用
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/buyVip", method = RequestMethod.POST)
    public Map<String, Object> buyVip(String transactionID, String receipt,String id) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        System.out.println("客户端传过来的值1：" + transactionID + "客户端传过来的值2：" + receipt);
        //todo 上线要改成正式环境 1 注意
        String verifyResult = IosVerifyUtil.buyAppVerify(receipt, 0);    //0.沙箱 1.先线上测试    发送平台验证
        if (verifyResult == null) {                                            // 苹果服务器没有返回验证结果
            System.out.println("无订单信息!");
        } else {                                                                // 苹果验证有返回结果
            System.out.println("线上，苹果平台返回JSON:" + verifyResult);
            JSONObject job = JSONObject.parseObject(verifyResult);
            String states = job.getString("status");

            //21000 App Store无法读取你提供的JSON数据  
            //21002 收据数据不符合格式  
            //21003 收据无法被验证  
            //21004 你提供的共享密钥和账户的共享密钥不一致  
            //21005 收据服务器当前不可用  
            //21006 收据是有效的，但订阅服务已经过期。当收到这个信息时，解码后的收据信息也包含在返回内容中  
            //21007 收据信息是测试用（sandbox），但却被发送到产品环境中验证  
            //21008 收据信息是产品环境中使用，但却被发送到测试环境中验证 

            //根据状态码动态的调用环境  如果状态码是21007 使用的是沙箱环境，重新调用
            if ("21007".equals(states)){
                verifyResult = IosVerifyUtil.buyAppVerify(receipt, 0);
                job = JSONObject.parseObject(verifyResult);
                states = job.getString("status");
            }

            System.out.println("苹果平台返回值：job" + job);
            if (states.equals("0")) { // 前端所提供的收据是有效的    验证成功
                String r_receipt = job.getString("receipt");
                JSONObject returnJson = JSONObject.parseObject(r_receipt);
                String in_app = returnJson.getString("in_app");
                //in_app 有可能返回json数组 ，获取最后一个数据进行验证
                JSONArray objects = JSONObject.parseArray(in_app);
                Object o = objects.get(objects.size() - 1);
                JSONObject in_appJson = JSONObject.parseObject(o.toString());

                String transaction_id = in_appJson.getString("transaction_id");   // 订单号
                /************************************************+自己的业务逻辑**********************************************************/

                //如果单号一致，进行业务逻辑
                if (transactionID.equals(transaction_id)) {


                }

                map.put("code", Const.SUCCESS_CODE);
                map.put("msg", "验证成功");
                /************************************************+自己的业务逻辑end**********************************************************/
            } else {
                map.put("code", Const.ERROR_CODE);
                map.put("msg", "receipt数据有问题");
            }
        }
        return map;
    }


}
